#ifndef STATE_MACHINE_H
#define STATE_MACHINE_H

#include <stdint.h>
#include <stdbool.h>
#include "stepper_motor.h"

// 任务类型枚举
typedef enum {
    TASK_NONE = 0,  // 未选择任务
    TASK_1 = 1,     // 基本要求(2): 场地中任意位置瞄准
    TASK_2 = 2,     // 基本要求(3): 轨迹上指定位置瞄准
    TASK_3 = 3      // 发挥部分: 行驶中连续瞄准
} TaskType_t;

// 系统全局状态枚举
typedef enum {
    SYSTEM_WAIT_TASK_SELECT = 0,  // 等待串口屏任务选择
    SYSTEM_TASK_RUNNING,          // 任务执行中
    SYSTEM_TASK_COMPLETE,         // 任务完成
    SYSTEM_ERROR                  // 系统错误
} SystemState_t;

// 任务1状态枚举
typedef enum {
    TASK1_GIMBAL_RESET = 0,      // 云台复位
    TASK1_FIXED_AIMING,          // 固定打靶
    TASK1_LASER_ON,              // 开启激光
    TASK1_LASER_OFF,             // 关闭激光
    TASK1_GIMBAL_RESET_AGAIN,    // 云台再次复位
    TASK1_COMPLETE               // 任务完成
} Task1State_t;

// 任务2状态枚举
typedef enum {
    TASK2_GIMBAL_RESET = 0,      // 云台复位
    TASK2_X_MOTOR_360_CW,        // X轴电机顺时针360度旋转
    TASK2_PREPARE_AIMING,        // 准备打靶状态(等待摄像头停止信号)
    TASK2_ADJUST_GIMBAL,         // 接收摄像头差值调整云台位置
    TASK2_LASER_ON,              // 开启激光
    TASK2_LASER_OFF,             // 关闭激光
    TASK2_GIMBAL_RESET_AGAIN,    // 云台再次复位
    TASK2_COMPLETE               // 任务完成
} Task2State_t;

// 任务3状态枚举
typedef enum {
    TASK3_GIMBAL_RESET = 0,      // 云台复位
    TASK3_X_MOTOR_45_CW,         // X轴电机顺时针旋转45度
    TASK3_ADJUST_GIMBAL_1,       // 第1次接收摄像头差值调整云台位置
    TASK3_LASER_ON,              // 开启激光
    TASK3_X_MOTOR_90_CW_1,       // 云台X轴顺时针旋转90度(第1次)
    TASK3_ADJUST_GIMBAL_2,       // 第2次接收摄像头差值调整云台位置
    TASK3_X_MOTOR_90_CW_2,       // 云台X轴顺时针旋转90度(第2次)
    TASK3_ADJUST_GIMBAL_3,       // 第3次接收摄像头差值调整云台位置
    TASK3_X_MOTOR_90_CW_3,       // 云台X轴顺时针旋转90度(第3次)
    TASK3_ADJUST_GIMBAL_4,       // 第4次接收摄像头差值调整云台位置
    TASK3_X_MOTOR_90_CW_4,       // 云台X轴顺时针旋转90度(第4次)
    TASK3_ADJUST_GIMBAL_5,       // 第5次接收摄像头差值调整云台位置
    TASK3_LASER_OFF,             // 到达终点关闭激光
    TASK3_GIMBAL_RESET_AGAIN,    // 云台再次复位
    TASK3_COMPLETE               // 任务完成
} Task3State_t;

// 状态机结构体
typedef struct {
    SystemState_t system_state;       // 系统全局状态
    TaskType_t current_task;          // 当前任务类型
    TaskType_t selected_task;         // 串口屏选择的任务
    uint16_t task1_state;             // 任务1状态
    uint16_t task2_state;             // 任务2状态
    uint16_t task3_state;             // 任务3状态
    bool is_running;                  // 状态机是否运行
    bool task_selection_received;     // 是否接收到任务选择
    bool camera_stop_signal;          // 摄像头停止信号
    bool car_position_signal;         // 小车位置信号(用于任务3同步)
    int16_t camera_x_offset;          // 摄像头X轴偏移值
    int16_t camera_y_offset;          // 摄像头Y轴偏移值
    uint32_t state_start_time;        // 状态开始时间
    uint8_t car_rotation_count;       // 小车旋转圈数计数(任务3使用)
} StateMachine_t;

// 云台控制结构体
typedef struct {
    int16_t x_position;               // X轴位置
    int16_t y_position;               // Y轴位置
    bool laser_enabled;               // 激光使能状态
    bool x_motor_moving;              // X轴电机运动状态
    bool y_motor_moving;              // Y轴电机运动状态
} GimbalControl_t;

// 函数声明
void StateMachine_Init(StateMachine_t *sm);
void StateMachine_Run(StateMachine_t *sm);
void StateMachine_SetTaskSelection(StateMachine_t *sm, TaskType_t task_type);
void StateMachine_SetCameraStopSignal(StateMachine_t *sm, bool signal);
void StateMachine_SetCameraOffset(StateMachine_t *sm, int16_t x_offset, int16_t y_offset);
void StateMachine_SetCarPositionSignal(StateMachine_t *sm, bool signal);
bool StateMachine_IsTaskComplete(StateMachine_t *sm);
void StateMachine_Reset(StateMachine_t *sm);

// 系统状态处理函数
void System_WaitTaskSelect_Handler(StateMachine_t *sm);
void System_TaskRunning_Handler(StateMachine_t *sm);
void System_TaskComplete_Handler(StateMachine_t *sm);

// 任务处理函数
void Task1_Handler(StateMachine_t *sm);
void Task2_Handler(StateMachine_t *sm);
void Task3_Handler(StateMachine_t *sm);

// 云台控制函数(需要用户实现)
extern void Gimbal_Reset(void);
extern void Gimbal_SetPosition(int16_t x_pos, int16_t y_pos);
extern void Gimbal_RotateX(int16_t angle);
extern void Gimbal_RotateY(int16_t angle);
extern void Laser_Enable(bool enable);
extern int  Gimbal_task1(void);
extern bool Gimbal_IsAtPosition(void);
extern bool Gimbal_IsRotationComplete(void);


// 串口中断处理函数
void UART_IRQHandler(StateMachine_t *sm);

// 调试和状态查询函数
const char* StateMachine_GetCurrentStateString(StateMachine_t *sm);
void StateMachine_PrintStatus(StateMachine_t *sm);

#endif // STATE_MACHINE_H
